package leetcode.tree_problem;

import java.util.*;

/**
 * 373. 查找和最小的 K 对数字
 * https://leetcode-cn.com/problems/find-k-pairs-with-smallest-sums/
 */
public class 查找和最小的K对数字 {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        class Pair{
            int u;
            int v;

            public Pair(int u, int v) {
                this.u = u;
                this.v = v;
            }
        }
        Queue<Pair> queue = new PriorityQueue<Pair>(new Comparator<Pair>() {
            @Override
            public int compare(Pair o1, Pair o2) {
                return (o2.u + o2.v) - (o1.u + o1.v);
            }
        });
        for (int i = 0; i < Math.min(nums1.length , k); i++) {
            for (int j = 0; j < Math.min(nums2.length , k); j++) {
                if (queue.size() < k){
                    queue.offer(new Pair(nums1[i] , nums2[j]));
                }else {
                    int addNums = nums1[i] + nums2[j];
                    Pair curPair = queue.peek();
                    if ((curPair.v + curPair.u) < addNums){
                        continue;
                    }else {
                        queue.poll();
                        queue.offer(new Pair(nums1[i] , nums2[j]));
                    }
                }
            }
        }
        List<List<Integer>> list = new ArrayList<>();
        for (int i = 0; i < k && (!queue.isEmpty()); i++) {//这里list.size 还没有值，所以循环的次数是k，并且要处理边界问题
            Pair curPair = queue.poll();
            List<Integer> curList = new ArrayList<>();
            curList.add(curPair.u);
            curList.add(curPair.v);
            list.add(curList);
        }
        return list;


    }
}
